﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading;
using System.Data.OleDb;
using Model;

namespace Control
{
    

    public class Control
    {
        #region Fields
        private static Control singleton;
        private DataAccessLayer dataAccesLayer;
        private ConP2 conP2;
        #endregion

        #region Singleton
        private Control() 
        {
            conP2 = new ConP2();
            dataAccesLayer = DataAccessLayer.GetInstance();
        }

        public static Control GetInstance()
        {
            if (singleton == null)
            {
                singleton = new Control();
            }
            return singleton;
        }
        #endregion

        #region Verwijderen
    
        /// <summary>
        /// Verwijdert een artikel uit de database en als het product in de winkel staat wordt het hier ook uit verwijdert
        /// </summary>
        /// <param name="id"></param>
        public void VerwijderArtikelUitWinkel(int id, int rek, int schap, int zijde, Artikel artikel)
        {
            VerWijderArtikelUitWinkel(rek,schap,zijde,artikel);
            dataAccesLayer.VerwijderArtikel(id);
        }

        public void VerwijderArtikelUitDatabase(int id)
        {
            dataAccesLayer.VerwijderArtikel(id);
        }

        /// <summary>
        /// Verwijdert een artikel uit de winkel
        /// </summary>
        /// <param name="rek"></param>
        /// <param name="schap"></param>
        /// <param name="zijde"></param>
        /// <param name="artikel"></param>
        public void VerWijderArtikelUitWinkel(int rek, int schap, int zijde, Artikel artikel)
        {
            conP2.VerwijderArtikel(artikel,schap,zijde,rek);
        }

        #endregion

        #region Toevoegen

        /// <summary>
        /// Voegt een Artikel Toe aan de winkel en controleert of deze ook al in de database zit.
        /// Als deze niet in de database zit wordt deze hieraan toegevoegd
        /// </summary>
        /// <param name="artikel"></param>
        /// <param name="schap"></param>
        /// <param name="zijde"></param>
        /// <param name="rek"></param>
        public void VoegArtikelToe(Artikel artikel, int schap, int zijde, int rek)
        {
            dataAccesLayer.VoegArtikelToe(artikel);
            conP2.VoegArtikelToe(artikel, schap, zijde, rek);
        }
        
        /// <summary>
        /// Voegt een artikel Toe aan database
        /// </summary>
        /// <param name="artikel"></param>
        public void VoegArtikelToeAanDatabase(Artikel artikel)
        {
            dataAccesLayer.VoegArtikelToe(artikel);            
        }


        public void VoegPOIToe(POI punt)
        {
            conP2.VoegPOIToe(punt);
        }
        #endregion

        #region Laden
        /// <summary>
        /// Laad de categorieën uit de database
        /// </summary>
        public void LaadAlleCategorieenUitDatabase()
        {
            List<string> LijstCategorie = new List<string>();
            DataSet dataset = dataAccesLayer.GetData("SELECT DISTINCT Categorie FROM Artikel");

            for (int i = 0; i < dataset.Tables[0].Rows.Count; i++)
            {
                LijstCategorie.Add(dataset.Tables[0].Rows[i][0].ToString());
            }

            conP2.GeefCategorieDoor(LijstCategorie);
        }

        public List<Artikel> LaadArtikelen(string categorie)
        {
            DataSet dataset = dataAccesLayer.GetData("SELECT DISTINCT * FROM artikel WHERE Categorie = \"" + categorie + "\";");
            List<Artikel> artikelen = new List<Artikel>();

            for (int i = 0; i < dataset.Tables[0].Rows.Count; i++)
            {
                String naam = dataset.Tables[0].Rows[i][1].ToString();
                String klasse = dataset.Tables[0].Rows[i][5].ToString();
                double prijs = Double.Parse(dataset.Tables[0].Rows[i][2].ToString());
                int volume = Int32.Parse(dataset.Tables[0].Rows[i][3].ToString());
                artikelen.Add(new Artikel(naam, klasse, prijs, volume, categorie));
            }
            return artikelen;
        }

        public DataSet LaadAlleNamenUitDatabase()
        {
            return dataAccesLayer.GetData("SELECT DISTINCT Naam,Id FROM Artikel ORDER BY Naam");
        }
        #endregion

        /// <summary>
        /// Laad alle winkels uit de database. 
        /// Winkels zonder straatnaam krijgen geen haakjes uiteraard.
        /// </summary>
        /// <returns>List</string></returns>
        public List<string> LaadAlleWinkelsUitDatabase()
        {
            List<string> winkelLijst = new List<string>();
            DataSet dataset = dataAccesLayer.GetData("SELECT Stad, Straat FROM Locatie");
            string add;
            string stad,straat;
            for (int i = 0; i < dataset.Tables[0].Rows.Count; i++)
            {
                stad = dataset.Tables[0].Rows[i][0].ToString();
                straat = dataset.Tables[0].Rows[i][1].ToString();
                if (straat == "")
                    add = stad;
                else add = stad + " (" + straat + ")";
               
                winkelLijst.Add(add);
            }
            return winkelLijst;
        }      
    }
}
